package view.simulationview;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.util.Dictionary;
import java.util.Hashtable;
import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JToolBar;
import javax.swing.SwingConstants;
import model.simulationmodel.SimulationModel;
import controller.commoncontroller.PictureExportListener;
import controller.simulationcontroller.PauseListener;
import controller.simulationcontroller.PlayListener;
import controller.simulationcontroller.ShowTruthTableListener;
import controller.simulationcontroller.SliderListener;
import controller.simulationcontroller.StopListener;
import view.UtilityConstants;
import view.commonview.TabbedPane;

/**
 * <b>Erbt:</b> <code>JPanel</code> <br>
 * <b>Funktion:</b> Repraesentation Simulationssteuerung<br>
 * <br>
 * Auf diesem Panel werden die fuer die Steuerung der Simulation benoetigten
 * Buttons angeordnet.
 * 
 * @author Team Locsi
 * 
 */
@SuppressWarnings("serial")
public class SimulationToolPanel extends JToolBar {

	/*
	 * Icons fuer das Darstellen der Zahnraeder im SimulationsModus
	 */
	private ImageIcon runningIcon = new ImageIcon(getClass().getClassLoader().getResource(UtilityConstants.ICON_PATH
			+ "zahnrad-ein.gif"));
	private ImageIcon stopIcon = new ImageIcon(getClass().getClassLoader().getResource(UtilityConstants.ICON_PATH
			+ "zahnrad-aus.gif"));
	private JLabel simStateLabel = new JLabel(stopIcon);

	/*
	 * Buttons fuer die Simulationssteuerung
	 */
	private JButton play = new JButton(new ImageIcon(getClass().getClassLoader().getResource(UtilityConstants.ICON_PATH
			+ "play.png")));
	private JButton pause = new JButton(new ImageIcon(getClass().getClassLoader().getResource(
			UtilityConstants.ICON_PATH + "pause.png")));
	private JButton stop = new JButton(new ImageIcon(getClass().getClassLoader().getResource(UtilityConstants.ICON_PATH
			+ "stop.png")));
	private JButton pic = new JButton(new ImageIcon(getClass().getClassLoader().getResource(UtilityConstants.ICON_PATH
			+ "cam.png")));
	private JButton truth = new JButton(new ImageIcon(getClass().getClassLoader().getResource(
			UtilityConstants.ICON_PATH + "table.png")));

	/*
	 * Panel und Label fuer das Darstellen des Geschwindigkeitsreglers
	 */
	private JPanel sliderPanel = new JPanel();
	private JLabel sliderLabel = new JLabel("Simulationsgeschwindigkeit");
	private JSlider slider = new JSlider(SwingConstants.HORIZONTAL, 1, 4, 3);
	private JLabel sliderValue = new JLabel("1 - fache Geschwindigkeit");
	
	//Referenz auf den Menueeintrag 'Wahrheitstabelle erstellen'. Wird benoetigt
	//um diesen auszugrauen wenn die Simulation laeuft
	private JMenuItem truthTableItem;

	/**
	 * Dieser Konstruktor erzeugt ein neues <code>SimulationToolPanel</code>
	 * -Objekt.
	 * 
	 * @param tabs
	 *            <code>TabbedPane</code> - Referenz auf das
	 *            <code>TabbedPane</code>
	 * @param <code>SimulationModel</code> - Referenz auf das
	 *        <code>SimulationModel</code>
	 */
	public SimulationToolPanel(TabbedPane tabs, final SimulationModel sModel) {
		super(JToolBar.HORIZONTAL);

		// setzen des icon fuer das zahnrad
		this.setBackground(new Color(238, 238, 238));
		this.add(Box.createHorizontalGlue());
		this.add(simStateLabel);
		this.add(Box.createHorizontalGlue());

		// hinzufuegen des play-buttons
		this.add(play);
		play.addActionListener(new PlayListener(sModel, this));
		play.setToolTipText("Simulation starten");
		this.add(Box.createRigidArea(new Dimension(15, 0)));

		// hinzufuegen des pause-buttons
		this.add(pause);
		pause.addActionListener(new PauseListener(sModel, this));
		pause.setToolTipText("Simulation pausieren");
		this.add(Box.createRigidArea(new Dimension(15, 0)));

		// hinzufuegen des stop-buttons
		this.add(stop);
		stop.addActionListener(new StopListener(sModel, this));
		stop.setToolTipText("Simulation beenden");
		this.add(Box.createRigidArea(new Dimension(60, 0)));

		// hinzufuegen des geschwindigkeitsreglers
		initializeSlider(sModel);
		Dictionary<Integer, Component> dic = new Hashtable<Integer, Component>();
		dic.put(1, new JLabel("0.25"));
		dic.put(2, new JLabel("0.5"));
		dic.put(3, new JLabel("1.0"));
		dic.put(4, new JLabel("2.0"));
		slider.setLabelTable(dic);
		this.add(sliderPanel);
		this.add(Box.createRigidArea(new Dimension(60, 0)));

		// hinzufuegen des bild-export-buttons
		this.add(pic);
		pic.addActionListener(new PictureExportListener(tabs));
		pic.setToolTipText("Als Bild exportieren");
		this.add(Box.createRigidArea(new Dimension(60, 0)));

		// hinzufuegen des wahrheitstabelle-erstellen-buttons
		this.add(truth);
		truth.addActionListener(new ShowTruthTableListener(sModel));
		truth.setToolTipText("Wahrheitstabelle erzeugen");
		this.add(Box.createHorizontalGlue());
	}

	/**
	 * Diese private Methode wird im Konstruktor aufgerufen um den
	 * <code>Slider</code> zu initialisieren.
	 * 
	 * @param <code>SimulationModel</code> - Referenz auf das
	 *        <code>SimulationModel</code>
	 */
	private void initializeSlider(SimulationModel sModel) {
		sliderPanel.setLayout(new BorderLayout());
		sliderPanel.setMaximumSize(new Dimension(200, 60));
		sliderPanel.setPreferredSize(new Dimension(200, 60));
		sliderPanel.add(sliderLabel, BorderLayout.NORTH);
		sliderPanel.add(slider, BorderLayout.CENTER);
		sliderPanel.add(sliderValue, BorderLayout.SOUTH);
		sliderLabel.setVerticalAlignment(SwingConstants.CENTER);
		sliderLabel.setHorizontalAlignment(SwingConstants.CENTER);
		sliderValue.setHorizontalAlignment(SwingConstants.CENTER);
		sliderValue.setVerticalAlignment(SwingConstants.CENTER);
		slider.setPaintTicks(true);
		slider.setPaintLabels(false);
		slider.setSnapToTicks(true);
		slider.setMajorTickSpacing(1);
		slider.setToolTipText("Regulierung der Simulationsgeschwindigkeit");
		slider.addChangeListener(new SliderListener(sModel.getCHandler(),
				sliderValue));
	}

	/**
	 * Setzt das animierte Icon, wenn die Simulation laeuft, bzw das statische
	 * Icon wenn die Simulation nicht laeuft
	 * 
	 * @param isRunning
	 *            gibt an ob die Simulation laeuft oder nicht
	 */
	public void setSimulationRunningGif(boolean isRunning) {
		if (isRunning) {
			simStateLabel.setIcon(runningIcon);
		} else {
			simStateLabel.setIcon(stopIcon);
		}
	}

	/**
	 * Gibt eine Referenz auf den Button zum erstellen einer Wahrheitstabelle
	 * zurueck.
	 * 
	 * @return <code>JButton</code>
	 */
	public JButton getTruthTableButton() {
		return truth;
	}
	
	/**
	 * Setzt den 'Wahrheitstabelle erzeugen'-Menueeintrag um diesen
	 * bei Bedarf deaktivieren zu koennen.
	 * @param item JMenuItem
	 */
	public void setTruthTableButtonInMenu(JMenuItem item) {
		this.truthTableItem = item;
	}
	
	/**
	 * Gibt den Menueeintrag 'Wahrheitstabelle erzeugen' zurueck um ihn bei Bedarf
	 * deaktivieren zu koennen.
	 * @return
	 */
	public JMenuItem getTruthTableButtonInMenu() {
		return this.truthTableItem;
	}
	
	@Override
	public void setEnabled(boolean enabled) {
	    super.setEnabled(enabled);
	    Component[] components = getComponents();
	    if (components != null && components.length > 0) {
	    int count = components.length;
	    for (int i = 0; i < count; i++)
	        components[i].setEnabled(enabled);
	    }
	}
}